{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Дискретизация по интервалам в 4 часа.\n",
    "\n",
    "Планировние по 8 (7) дней.\n",
    "\n",
    "Планирование по месяцу, может затрагивать разные недели. Пересчет потребности в анализах $D_a$ - потребность в анализах в очередные 8 дней месяца.\n",
    "\n",
    "Переменные решения:\n",
    "$x_{d,i,a}$ - бинарные. 1, если врач d работает в интервал i над анализами a.\n",
    "\n",
    "Входные данные:\n",
    "\n",
    "$S_d, a$ -- специализации врача d (0\\1), $S_d[0]$ -- основная специализация.\n",
    "\n",
    "$V_d$ -- интервалы недоступности врача d.\n",
    "\n",
    "$R_d$ -- ставка врача от 0 до 1.\n",
    "\n",
    "$N_d$ -- согласие на ночные смены 0/1.\n",
    "\n",
    "$U_d$ -- основной тип смены, 8/1, 12/2, 24/3.\n",
    "\n",
    "$D_a$ - потребность в анализах в очередные 8 дней месяца.\n",
    "\n",
    "$p_a$ - количество выполненных анализов a за интвервал в 4 часа.\n",
    "\n",
    "$l_d$ - сколько врач отработал на текущей  календарной неделе.\n",
    "\n",
    "$H$ - список ночных, выходных, праздничных интервалов.\n",
    "\n",
    "Ограничения:\n",
    "1) В каждую неделю все исследования выполнены.\n",
    "2) Каждую неделю есть хотя бы 1 раз 48 часов перерыв.\n",
    "3) Смены непрерывны.\n",
    "4) Врачи работают не более 40 часов в неделю.\n",
    "5) Врачи работают в свои смены.\n",
    "6) Между сменами интервалы отдыха (8-12, 12-16, 24-36).\n",
    "7) врачи не могут одновременно выполнять разные анализы.\n",
    "8) начало отсчета в 8:00\n",
    "\n",
    "ЦФ:\n",
    "Равномерная работа (не в один день все работают), ночью и на выходных не больше 1/4 от всех. Минимизация выполнения исследований не по своей специализации\n",
    "\n",
    "\n",
    " \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Входные данные:\n",
    "\n",
    "$S_{d}$ -- специализации врача d (0\\1), $S_d[0]$ -- основная специализация.\n",
    "\n",
    "$V_d$ -- интервалы недоступности врача d.\n",
    "\n",
    "$R_d$ -- ставка врача от 0 до 1.\n",
    "\n",
    "$N_d$ -- согласие на ночные смены 0/1.\n",
    "\n",
    "$U_d$ -- основной тип смены (2,3,6 интервалов), 8/1, 12/2, 24/3.\n",
    "\n",
    "$D_a$ - потребность в анализах в очередные 8 дней месяца.\n",
    "\n",
    "$p_a$ - количество выполненных анализов a за интвервал в 4 часа.\n",
    "\n",
    "$l_d$ - сколько врач отработал на текущей  календарной неделе.\n",
    "\n",
    "$H$ - список ночных, выходных, праздничных интервалов."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ограничения:\n",
    "\n",
    "1) в каждый интервал врач выполняет только один вид анализов:\n",
    "$$\\sum_{a=1}^{A} x_{d,a,i} \\leq 1 \\quad \\forall d, i$$\n",
    "\n",
    "2) врачи выполняют анализы только своей специализации:\n",
    "$$x_{d,a,i} \\leq S_{d,a} \\quad \\forall d, a, i$$\n",
    "\n",
    "3) в каждый горизонт планирования все анализы выполнены:\n",
    "$$\\sum_{d=1}^{D} \\sum_{i=1}^{T} x_{d,a,i} \\cdot p_{a} \\geq D_{a} \\quad \\forall a$$\n",
    "\n",
    "4) непрерывность смен:\n",
    "\n",
    "Введем зависиммую переменную $z_{d,i} = (1-\\sum_a x_{d,a,i-1})*\\sum_a x_{d,a,i}$, которая характеризует начало смены. Тогда непрерывность обеспечивается indicator constraint: $$z_{d,i} = 1 \\to \\sum_i^{i+U_d -1} \\sum_a  x_{d,a,i} = U_d$$\n",
    "\n",
    "5) каждую неделю есть непрерывный отдых не меньше 48 часов:\n",
    "\n",
    "Введем зависиммую переменную $k_{d,i} = \\sum_a x_{d,a,i-1}*(1-\\sum_a x_{d,a,i})$, которая характеризует начало отдыха. Ввдем зависимую переменную $c_{d,i}$, характеризующую продолжительность отдыха: $$k_{d,i} = 1 \\to \\sum_i^{i+11} \\sum_a  x_{d,a,i} = c_{d,i}$$\n",
    "\n",
    "Тогда за неделю $w$ хотя бы раз был отдых не менее 48 часов: $$\\max_{i \\in w} (c_{d,i}) >= 12.$$\n",
    "\n",
    "6) между сменами есть нерперывный отдых соответствующей продолжительности. Задается аналогично (5).\n",
    "\n",
    "7) врачи, несогласные на ночные смены, работают днем:\n",
    "\n",
    "$$N_d = 0 \\to x_{d,a,i} = 0, i \\in H.$$\n",
    "\n",
    "8) в рабочие дни работает большинство, в ночные меньше:\n",
    "    $$\\sum_{i \\in H} \\sum_d \\sum_a x_{d,a,i} <= 0.25*D.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Целевая функция**\n",
    "\n",
    "Целевая функция состоит из нескольких частей с различными весовыми коэффициентами. Записываем те ограничения, которые могут быть нарушены, но с дополнительным штрафом.\n",
    "\n",
    "1) ночные смены, выходные и праздники\n",
    "\n",
    "$$F_1 = q_1 * \\sum_{i \\in H} \\sum_d \\sum_a x_{d,a,i}$$\n",
    "\n",
    "2) исследования не по своей основной специализации\n",
    "\n",
    "$$F_2 = q_2 * \\sum_{i} \\sum_d \\sum_{a \\in \\{S_d \\setminus S_d[0]\\}} x_{d,a,i}$$\n",
    "\n",
    "$$F = F_1 + F_2 \\to \\min$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
